package forRecherche;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

import objects.DocumentPondere;

import DB.BddManager;


public class Recherche {

	/**
	 * La requete de l'utilisateur (sous forme de liste)
	 */
	private ArrayList<MotRequete> requete;
	
	private BddManager dbManager;
	/**
	 * La liste des noms des documents html
	 */
	private ArrayList<String> listeDeDocument;
	/**
	 * Path ou sont stocke les documents html
	 */
	private String pathDossier;

	//la liste de mot de l'utiisateur est un liste de String
	//Pour chaque mot, on regarde si il est present dans le document i et combien de fois
	//On somme ces présences : on obtient un score du document
	//les documents sont retournes classes par ordre de score

	/**
	 * Constructeur : d'une saisie utilisateur, on remplit les differents attributs. Chaque mot de la saisie a une ponderation de 1
	 * @param saisieUtilisateur String de l'utilisateur
	 * @param repertoire le repertoire ou sont les documents html
	 */
	public Recherche(String saisieUtilisateur, File repertoire){
		this.requete = new ArrayList<MotRequete>();
		this.dbManager = BddManager.getInstance();
		this.pathDossier = repertoire.getAbsolutePath();

		this.fillListeDeDocument(repertoire);
		
		String[] parties = saisieUtilisateur.split("[^a-zA-Z0-9éèàçù/]");

		for(String s : parties){
			s=s.toLowerCase();
			//par défaut la ponderation de chaque mot est de 1
			if(!s.equalsIgnoreCase(" ") && !s.equalsIgnoreCase("")){
				this.requete.add(new MotRequete(s, 1));
			}
		}
	}

	public Recherche(ArrayList<MotRequete> requete, File repertoire){
		this.requete = new ArrayList<MotRequete>();
		this.dbManager = BddManager.getInstance();
		this.pathDossier = repertoire.getAbsolutePath();

		this.fillListeDeDocument(repertoire);
		
		for(MotRequete s : requete){
			s.setMot(s.getMot().toLowerCase());
			this.requete.add(s);
		}
	}
	
	/**
	 * Effectue la recherche pour une requete donnee
	 * @return une liste de document, ordonnee par ordre de pertinence
	 */
	public ArrayList<DocumentPondere> makeResearch(){
		Float score;
		ArrayList<DocumentPondere> resultat = new ArrayList<DocumentPondere>();

		for(String document : this.listeDeDocument){
			score = this.getScoreFromDocument(document)	;
			resultat.add(new DocumentPondere(document, score));
		}
		Collections.sort(resultat);
		return resultat;
	}

	/**
	 * Remplit l'attribut listeDeDocument
	 * @param repertoire le repertoire contenant les documents html
	 */
	private void fillListeDeDocument(File repertoire){
		String[] listeFichiers;
		this.listeDeDocument = new ArrayList<String>();

		listeFichiers = repertoire.list();
		try {
			for(int i=0;i<listeFichiers.length;i++){
				if(listeFichiers[i].substring(0,1).equals("D"))
					this.listeDeDocument.add(listeFichiers[i]);
			}
		}catch(NullPointerException e){
			System.out.println("Folder provided Empty : Parser can't be constructed (NullPointerException)"+e.getMessage());
		}
	}

	/**
	 * Pour un document, retourne sont score
	 * @param nomDocument nom du document
	 * @return le score du document, pour la requete donnee
	 */
	public float getScoreFromDocument(String nomDocument){
		return this.getScoreFromVector(this.dbManager.getVecteurPonderation(this.requete, nomDocument));
	}

	/**
	 * Retourne le score d'un vecteur
	 * @param vector le vecteur
	 * @return le score
	 */
	private float getScoreFromVector(ArrayList<Float> vector){
		float resultat = 0;

		for(Float i : vector){
			resultat+=i;
		}
		return resultat;
	}

	/**
	 * getter de la liste des documents
	 * @return la liste des documents
	 */
	public ArrayList<String> getListeDeDocument() {
		return listeDeDocument;
	}
	
	public void printResult(ArrayList<DocumentPondere> list){
		for(DocumentPondere i : list){
			System.out.println(i.getNomDocument()+" a pour ponderation "+i.getPonderation());
		}
	}
	
	public String getResult(ArrayList<DocumentPondere> list){
		String result = new String();
		for(DocumentPondere i : list){
			result+=i.getNomDocument()+" a pour ponderation "+i.getPonderation()+"\n";
		}
		return result;
	}
}
